<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      /* 
      ------分数注意事项-----
      本次测试满分为100(最多100分), 有4道加分题; 答案不够完整或者有错误当题0分处理; 

      ------分数处理-----
      (0-60]: 不及格, 处理: 提供第二份不同试卷晚自习的时候重新考试, 并在第二天晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (60-75]: 良良, 处理: 晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (75-90]: 良好, 处理: 放你一马, 好好复习;

      (90-100]: 优秀, 处理: 好好好, 继续保持;
      */

      // 1.JS延迟加载的方式有哪些？（5）
      // setInterval 和 setTimeout

      // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；（5）
      // ECMAScript:是js的一些基本规范，像变量的声明，基本数据类型，引用数据类型等等
      // DOM：是 document Object model  文档对象模型
      // BOM：Browser Object model 浏览器对象模型

      // 4.如何进行数据类型的判断？（5）
      /* typeof 
         instanceof
         Object.prototype.toString.call() 
         constructor
         */

      // 5.null 和 undefined 的区别？什么时候会得到 undefined？（5）
      /* 
           null 是 对象初始化用的 类型是object 
           undefined 是未定义 类型是undefined
           得到undefined现象
           1.访问对象上不存在的属性
           2.声明的变量未赋值
           3.函数返回值默认返回undefined
           4.直接return undefined
       */

      // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？（5）
      /* 
      null == undefined  返回 true
      == 是判断值
      在进行比较的时候会先隐式转换为数字类型 null和undefined 转为数字类型后它们的值都是0 所以相等

      null === undefined 返回 false
      === 是值和类型都要相等
      null和undefined的类型不相等
      null的类型是object
      undefined的类型是undefined 

      */

      // 7.使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      /* 
      continue 是跳过当前的条件，继续执行下一个
      break 是直接跳出 终止循环
       */

      // 8.如何判断字符串内是否包含指定字符？（5）
      /* 
      indexof()
      includes()
       */

      // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；（5）
      /* 
      会修改原数组的方法
      pop —— 从数组尾部删除
      push —— 从数组尾部添加
      shift ——  从数组头部删除
      unshift —— 从数组头部添加
      splice —— 删除 增加 替换
      sort —— 排序
      reserve —— 倒序，反转

      不会修改原数组的方法
      indexof() 
      includes()
      lastIndexof()
      concat()
      map()
      filter()
      reduce()
       */

      // 10. 请写出下面语句的输出结果：（5）
      // let bar = true, number = 0;
      // console.log(bar + 0); // 1
      // console.log(bar + "xyz"); //truexyz
      // console.log(bar + true);// 2
      // console.log(+true); // 1
      // console.log(!'bluej');// false
      // console.log(number++);// 0
      // console.log(++number);//2
      // console.log(number); // 2

      // 11. 根据用户输入时间实现倒计时，输入时间格式错误时要有错误提示（5）
      // window.prompt("请输入目标时间");
      // let t = new Date(window.prompt('请输入目标时间')).getTime();

      // 12.输出从小到大排序好的五个不重复的随机"素数",范围[10-58)；（10）
      // 输出  排序 去重 随机数 质数
      // 质数也叫素数是指在大于1的自然数中，除了1和它本身以外不再有其他因数的自然数，不能被任何整数整除的数。
      /*       function randomFn(min, max) {
        let arr = [];
        while (arr.length < 5) {
          let res = Math.floor(Math.random() * (max - min) + min);
          if (!arr.includes(res)) {
            arr.push(res);
          }
        }
        arr.sort((a, b) => {
          return a - b;
        });

        console.log('arr', arr);
      }
      randomFn(10, 58); */

      // 13.把下面数组成员排序打乱；（5）
      /*  let arr13 = [10, 20, 30, 40, 50, 60];
      let newArr2 = []; // 打乱之后的数组 */

      // for (let i = 0; i < arr13.length; i--) {
      //   let temp = 0;
      //   temp = arr13[i];
      //   arr13[i] = arr13[i+1];
      //   arr13[i+1] = temp;
      // }
      // console.log('newArr2', newArr2);

      // 14. 将多个数组进行去重合并；（10）
      /*      let arr140 = [1, 2, 3],
        arr141 = [2, 3, 4, 5];
      let comArr = arr140.concat(arr141);
      let newArr = [];
      for (let i = 0; i < comArr.length; i++) {
        if (newArr.indexOf(comArr[i]) === -1) {
          newArr.push(comArr[i]);
        }
      }
      console.log('newArr', newArr); */

      // 15. 找出数组 arr=[1, 2, 3, "a", 4, "a", 2, 4, "a"] 中重复出现过的元素,并用数组将重复元素装起来输出,并且统计每个元素出现的次数（10）

      /* let arr15 = [1, 2, 3, 'a', 4, 'a', 2, 4, 'a'];
      let obj = {};
      let objRes = arr15.reduce((prev, item) => {
        prev[item] = prev[item] + 1 || 1;
        return prev;
      }, {});
      console.log('objRes', objRes); // {1: 1, 2: 2, 3: 1, 4: 2, a: 3}
      let newObjArr = [];
      for (const key in objRes) {
        if (objRes[key] > 1) {
          newObjArr.push(key);
        }
      }
      console.log('newObjArr', newObjArr); // ['2', '4', 'a'] */

      // 16. 找出数组中年龄小于18岁的女生的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      /*       let arr16 = [
        {
          name: '111',
          sex: 'boy',
          age: 18,
          count: 20,
        },
        {
          name: '222',
          sex: 'girl',
          age: 17,
          count: 30,
        },
        {
          name: '333',
          sex: 'boy',
          age: 16,
          count: 40,
        },
        {
          name: '444',
          sex: 'girl',
          age: 15,
          count: 50,
        },
        {
          name: '555',
          sex: 'boy',
          age: 20,
          count: 60,
        },
        {
          name: '666',
          sex: 'girl',
          age: 13,
          count: 70,
        },
        {
          name: '777',
          sex: 'boy',
          age: 14,
          count: 80,
        },
      ];

      let newArr16 = arr16
        .filter((item) => {
          return item.age < 18;
        })
        .map((item) => item.count ** 2);

      console.log('newArr16', newArr16); // [900, 1600, 2500, 4900, 6400] */

      // 17. 实现一个深克隆函数 (加分题 5)
      /*      let obj = {
        a: 1,
        b: 1,
        arr: [1, 2, 3],
      };

      function deepClone(obj) {
        let res = Array.isArray(obj) ? [] : {};

        for (const key in obj) {
          // res[key] = obj[key];
          // console.log(res[key]);
          if (obj[key] instanceof Object) {
            res[key] = deepClone(obj[key]);
          } else {
            res[key] = obj[key];
          }
        }
        return res;
      }
      const newObj = deepClone(obj);
      newObj.arr[0] = 555;
      console.log('obj', obj);
      console.log(newObj); */
      // 18. 实现一个数组的reduce方法 (加分题 5)

      /* let reduceArr = [1, 2, 3, 4, 5];
      let res = reduceArr.reduce((prev, item) => {
        return prev + item;
      }, 0);
      console.log('res', res); */
      // 19. 写出强制转换的方法有哪些 (加分题 5)
      /* 
        toString()
        字符串的拼接
        Number()
       */
      let num = 1;
      let str = 'a';
      let boo = false;
      // console.log(num.toString());
      // console.log(Number(str));
      // console.log(Number(boo));

      // 20. 如何判断一个对象是否为空对象的3种方法 (加分题 5)

      // let obj = {
      //   a: 1,
      //   b: 2,
      // };

      // 第一种  Object.getOwnPropertyNames(obj)  返回一个数组，数组的长度为0说明对象为空对象

      // 第二种  Object.keys(obj)   返回一个数组，数组的长度为0说明对象为空对象

      // 第三种
      // 用数组的长度判断
      // 遍历对象，把对象的key添加到数组中；
      // 对象为空对象，则数组的长度为0

      // console.log('obj', obj);
      // function objFn(obj) {
      //   let newArr = [];

      //   for (const key in obj) {
      //     newArr.push(key);
      //   }
      //   if (newArr.length == 0) {
      //     console.log('数组为空数组，该对象也为空对象');
      //   }
      //   console.log('newArr', newArr);
      // }
      // objFn(obj);
    </script>
  </body>
</html>
